package com.dwy2002.course;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dwy2002.common.Result;
import com.dwy2002.common.annotation.RequiresPermission;
import com.dwy2002.course.service.ICoursesService;
import com.dwy2002.enums.Logical;
import com.dwy2002.pojo.dto.courses.CoursesDTO;
import com.dwy2002.pojo.dto.courses.CoursesPageDTO;
import com.dwy2002.pojo.po.courses.Courses;
import com.dwy2002.pojo.vo.courses.CoursesVO;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/01/21
 */
@RestController
@RequestMapping("/courses")
@RequiredArgsConstructor
public class CoursesController {
    private final ICoursesService service;

    /**
     * 分页查询
     * <p>
     * 查询：可按标题搜索
     * <p>
     * 排序：可按课程开始时间、课程创建时间、课程修改时间、课程费用进行升序和降序排序
     * <p>
     * 分类：可按课程状态进行分类。
     *
     * @param coursesPage 课程类的分页数据类
     * @author 杜伟毅
     * @since 2025/1/21 0021 17:32
     */
    @PostMapping("/page")
    public Result<Page<Courses>> getCoursesPage(@RequestBody CoursesPageDTO coursesPage) {
        return service.getCoursesPage(coursesPage);
    }

    /**
     * 修改课程
     *
     * @param courses 从前端接收的修改课程信息
     * @author 杜伟毅
     * @since 2025/1/21 0021 23:31
     */
    @RequiresPermission(value = {"A8"}, logical = Logical.OR)
    @PutMapping
    public Result<Void> updateCourses(@RequestBody CoursesDTO courses) {
        return service.updateCourses(courses);
    }

    /**
     * 批量删除课程
     *
     * @param ids 课程ID
     * @author 杜伟毅
     * @since 2025/2/7 0007 22:38
     */
    @RequiresPermission(value = {"A8"}, logical = Logical.OR)
    @DeleteMapping
    public Result<Void> deleteListCourses(@RequestBody List<String> ids) {
        return service.deleteListCourses(ids);
    }

    /**
     * 创建课程
     *
     * @param courses 从前端接收的创建课程信息
     * @author 杜伟毅
     * @since 2025/1/22 0022 18:26
     */
    @RequiresPermission(value = {"A8"}, logical = Logical.OR)
    @PostMapping
    public Result<Void> insertCourses(@RequestBody CoursesDTO courses) {
        return service.insertCourses(courses);
    }

    /**
     * 获取课程详情
     *
     * @param id 课程的ID
     * @author 杜伟毅
     * @since 2025/1/24 0024 17:51
     */
    @GetMapping("/{id}")
    public Result<CoursesVO> getCourseDetails(@PathVariable String id) {
        return service.getCourseDetails(id);
    }

    /**
     * 报名课程
     *
     * @param id 课程的ID
     * @author 杜伟毅
     * @since 2025/1/23 0023 0:02
     */
    @PostMapping("/join/{id}")
    public Result<Void> joinCourse(@PathVariable String id) {
        return service.joinCourse(id);
    }

    /**
     * 取消报名课程
     *
     * @param id 课程的ID
     * @author 杜伟毅
     * @since 2025/1/23 0023 0:02
     */
    @PostMapping("/leave/{id}")
    public Result<Void> leaveCourse(@PathVariable String id) {
        return service.leaveCourse(id);
    }
}
